/*
 * key.h
 *
 *  Created on: Oct 11, 2023
 *      Author: w
 */

#ifndef SRC_KEY_H_
#define SRC_KEY_H_

#include "CH58x_common.h"

#define HW_VER  21U

#if (HW_VER == 10)
#define PUL_IO_INIT()   GPIOB_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA)
#define DIR_IO_INIT()   GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA)
#define PUL_OUT_H()     GPIOB_SetBits(GPIO_Pin_7)
#define PUL_OUT_L()     GPIOB_ResetBits(GPIO_Pin_7)
#define DIR_OUT_H()     GPIOB_SetBits(GPIO_Pin_4)
#define DIR_OUT_L()     GPIOB_ResetBits(GPIO_Pin_4)

#define IN1_IO_INIT()   GPIOB_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_PU)
#define IN2_IO_INIT()   GPIOB_ModeCfg(GPIO_Pin_13, GPIO_ModeIN_PU)
#define LIM1_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_14, GPIO_ModeIN_PU)
#define LIM2_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU)

#define IN1_READ()      ((GPIOB_ReadPortPin(GPIO_Pin_12) == 0x00)?1:0)
#define IN2_READ()      ((GPIOB_ReadPortPin(GPIO_Pin_13) == 0x00)?1:0)
#define LIM1_READ()     ((GPIOB_ReadPortPin(GPIO_Pin_14) == 0x00)?1:0)
#define LIM2_READ()     ((GPIOB_ReadPortPin(GPIO_Pin_15) == 0x00)?1:0)

#define ENCA_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_23, GPIO_ModeIN_PU)
#define ENCB_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeIN_PU)
#define ENCZ_IO_INIT()  GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU)

#define ENC1_A_READ()   ((GPIOB_ReadPortPin(GPIO_Pin_23) == 0x00)?1:0)
#define ENC1_B_READ()   ((GPIOB_ReadPortPin(GPIO_Pin_22) == 0x00)?1:0)
#define ENC1_Z_READ()   ((GPIOA_ReadPortPin(GPIO_Pin_8) == 0x00)?1:0)

#elif (HW_VER == 20)

#define PUL1_IO_INIT()   GPIOA_ModeCfg(GPIO_Pin_3, GPIO_ModeOut_PP_5mA)
#define DIR1_IO_INIT()   GPIOA_ModeCfg(GPIO_Pin_2, GPIO_ModeOut_PP_5mA)
#define PUL1_OUT_H()     GPIOA_SetBits(GPIO_Pin_3)
#define PUL1_OUT_L()     GPIOA_ResetBits(GPIO_Pin_3)
#define DIR1_OUT_H()     GPIOA_SetBits(GPIO_Pin_2)
#define DIR1_OUT_L()     GPIOA_ResetBits(GPIO_Pin_2)

#define PUL2_IO_INIT()   GPIOA_ModeCfg(GPIO_Pin_1, GPIO_ModeOut_PP_5mA)
#define DIR2_IO_INIT()   GPIOA_ModeCfg(GPIO_Pin_0, GPIO_ModeOut_PP_5mA)
#define PUL2_OUT_H()     GPIOA_SetBits(GPIO_Pin_1)
#define PUL2_OUT_L()     GPIOA_ResetBits(GPIO_Pin_1)
#define DIR2_OUT_H()     GPIOA_SetBits(GPIO_Pin_0)
#define DIR2_OUT_L()     GPIOA_ResetBits(GPIO_Pin_0)

#define IN1_IO_INIT()   GPIOB_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_PU)
#define IN2_IO_INIT()   GPIOB_ModeCfg(GPIO_Pin_13, GPIO_ModeIN_PU)
#define IN3_IO_INIT()   GPIOB_ModeCfg(GPIO_Pin_14, GPIO_ModeIN_PU)
#define IN4_IO_INIT()   GPIOB_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU)
#define LIM1_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_16, GPIO_ModeIN_PU)
#define LIM2_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_17, GPIO_ModeIN_PU)
#define LIM3_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU)
#define LIM4_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeIN_PU)

#define SIG1_IO_INIT()  GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU)
#define SIG2_IO_INIT()  GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeIN_PU)

#define IN1_READ()      ((GPIOB_ReadPortPin(GPIO_Pin_12) == 0x00)?1:0)
#define IN2_READ()      ((GPIOB_ReadPortPin(GPIO_Pin_13) == 0x00)?1:0)
#define IN3_READ()      ((GPIOB_ReadPortPin(GPIO_Pin_14) == 0x00)?1:0)
#define IN4_READ()      ((GPIOB_ReadPortPin(GPIO_Pin_15) == 0x00)?1:0)
#define LIM1_READ()     ((GPIOB_ReadPortPin(GPIO_Pin_16) == 0x00)?1:0)
#define LIM2_READ()     ((GPIOB_ReadPortPin(GPIO_Pin_17) == 0x00)?1:0)
#define LIM3_READ()     ((GPIOB_ReadPortPin(GPIO_Pin_8) == 0x00)?1:0)
#define LIM4_READ()     ((GPIOB_ReadPortPin(GPIO_Pin_9) == 0x00)?1:0)

#define SIG1_READ()     ((GPIOA_ReadPortPin(GPIO_Pin_8) == 0x00)?1:0)
#define SIG2_READ()     ((GPIOA_ReadPortPin(GPIO_Pin_9) == 0x00)?1:0)

#define ENCA_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_18, GPIO_ModeIN_PU)
#define ENCB_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_19, GPIO_ModeIN_PU)
#define ENCZ_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeIN_PU)

#define ENC1_A_READ()   ((GPIOB_ReadPortPin(GPIO_Pin_18) == 0x00)?1:0)
#define ENC1_B_READ()   ((GPIOB_ReadPortPin(GPIO_Pin_19) == 0x00)?1:0)
#define ENC1_Z_READ()   ((GPIOB_ReadPortPin(GPIO_Pin_22) == 0x00)?1:0)

#elif(HW_VER == 21)

#define PUL1_IO_INIT()   GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA)
#define DIR1_IO_INIT()   GPIOB_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA)
#define PUL1_OUT_H()     GPIOA_SetBits(GPIO_Pin_9)
#define PUL1_OUT_L()     GPIOA_ResetBits(GPIO_Pin_9)
#define DIR1_OUT_H()     GPIOB_SetBits(GPIO_Pin_9)
#define DIR1_OUT_L()     GPIOB_ResetBits(GPIO_Pin_9)

#define PUL2_IO_INIT()   GPIOA_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA)
#define DIR2_IO_INIT()   GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_5mA)
#define PUL2_OUT_H()     GPIOA_SetBits(GPIO_Pin_7)
#define PUL2_OUT_L()     GPIOA_ResetBits(GPIO_Pin_7)
#define DIR2_OUT_H()     GPIOA_SetBits(GPIO_Pin_8)
#define DIR2_OUT_L()     GPIOA_ResetBits(GPIO_Pin_8)

#define IN1_IO_INIT()   GPIOB_ModeCfg(GPIO_Pin_13, GPIO_ModeIN_PU)
#define IN2_IO_INIT()   GPIOB_ModeCfg(GPIO_Pin_14, GPIO_ModeIN_PU)
#define IN3_IO_INIT()   GPIOB_ModeCfg(GPIO_Pin_12, GPIO_ModeIN_PU)
#define IN4_IO_INIT()   GPIOB_ModeCfg(GPIO_Pin_3, GPIO_ModeIN_PU)
#define LIM1_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU)
#define LIM2_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_17, GPIO_ModeIN_PU)
#define LIM3_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_16, GPIO_ModeIN_PU)
#define LIM4_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_15, GPIO_ModeIN_PU)

//#define SIG1_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_1, GPIO_ModeIN_PU)
//#define SIG2_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_PU)
#define SIG1_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_2, GPIO_ModeIN_PD)
#define SIG2_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_1, GPIO_ModeIN_PD)

#define IN1_READ()      ((GPIOB_ReadPortPin(GPIO_Pin_13) == 0x00)?1:0)
#define IN2_READ()      ((GPIOB_ReadPortPin(GPIO_Pin_14) == 0x00)?1:0)
#define IN3_READ()      ((GPIOB_ReadPortPin(GPIO_Pin_12) == 0x00)?1:0)
#define IN4_READ()      ((GPIOB_ReadPortPin(GPIO_Pin_3) == 0x00)?1:0)
#define LIM1_READ()     ((GPIOB_ReadPortPin(GPIO_Pin_8) == 0x00)?1:0)
#define LIM2_READ()     ((GPIOB_ReadPortPin(GPIO_Pin_17) == 0x00)?1:0)
#define LIM3_READ()     ((GPIOB_ReadPortPin(GPIO_Pin_16) == 0x00)?1:0)
#define LIM4_READ()     ((GPIOB_ReadPortPin(GPIO_Pin_15) == 0x00)?1:0)

//#define SIG1_READ()     ((GPIOB_ReadPortPin(GPIO_Pin_1) == 0x00)?1:0)
//#define SIG2_READ()     ((GPIOB_ReadPortPin(GPIO_Pin_2) == 0x00)?1:0)
#define SIG1_READ()     ((GPIOB_ReadPortPin(GPIO_Pin_2) != 0x00)?1:0)
#define SIG2_READ()     ((GPIOB_ReadPortPin(GPIO_Pin_1) != 0x00)?1:0)

#define ENCA_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_20, GPIO_ModeIN_PU)
#define ENCB_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_21, GPIO_ModeIN_PU)
#define ENCZ_IO_INIT()  GPIOB_ModeCfg(GPIO_Pin_22, GPIO_ModeIN_PU)

#define ENC1_A_READ()   ((GPIOB_ReadPortPin(GPIO_Pin_20) == 0x00)?1:0)
#define ENC1_B_READ()   ((GPIOB_ReadPortPin(GPIO_Pin_21) == 0x00)?1:0)
#define ENC1_Z_READ()   ((GPIOB_ReadPortPin(GPIO_Pin_22) == 0x00)?1:0)

#endif

#define ENC1_READ()     (ENC1_A_READ()|(ENC1_B_READ()<<1))

#define STEP_MOTOR1_DIR_CCW()        DIR1_OUT_H()
#define STEP_MOTOR1_DIR_CW()         DIR1_OUT_L()

#define STEP_MOTOR1_START_TIMER()    R8_TMR0_CTRL_MOD=RB_TMR_COUNT_EN
#define STEP_MOTOR1_STOP_TIMER()     R8_TMR0_CTRL_MOD=0

#define STEP_MOTOR2_DIR_CCW()        DIR2_OUT_H()
#define STEP_MOTOR2_DIR_CW()         DIR2_OUT_L()

#define STEP_MOTOR2_START_TIMER()    R8_TMR2_CTRL_MOD=RB_TMR_COUNT_EN
#define STEP_MOTOR2_STOP_TIMER()     R8_TMR2_CTRL_MOD=0

#define ENC_CODE_IDLE       0x00
#define ENC_CODE_LEFT       0x01
#define ENC_CODE_RIGHT      0x02
#define ENC_CODE_CLICK      0x03
#define ENC_CODE_D_CLICK    0x04
#define ENC_CODE_L_CLICK    0x05
#define ENC_CODE_T_CLICK    0x06

#define CODE_NONE               (0x00)
#define CODE_CLICK              (0x01)
#define CODE_D_CLICK            (0x02)
#define CODE_L_CLICK            (0x03)
#define CODE_T_CLICK            (0x04)

#define KEYA_CLK_EN()           RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC, ENABLE)
#define KEYB_CLK_EN()           RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC, ENABLE)
#define KEYC_CLK_EN()           RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC, ENABLE)
#define KEYD_CLK_EN()           RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC, ENABLE)

#define LIMITS_CLK_EN()         RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE)
#define LIMITE_CLK_EN()         RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE)

#define KEYA_PORT               GPIOC
#define KEYA_PIN                GPIO_PIN_0
#define KEYB_PORT               GPIOC
#define KEYB_PIN                GPIO_PIN_1
#define KEYC_PORT               GPIOC
#define KEYC_PIN                GPIO_PIN_2
#define KEYD_PORT               GPIOC
#define KEYD_PIN                GPIO_PIN_3

#define LIMITS_PORT             GPIOB
#define LIMITS_PIN              GPIO_PIN_8
#define LIMITE_PORT             GPIOB
#define LIMITE_PIN              GPIO_PIN_9

#define LIMITS_GET()            ((LIMITS_PORT->PID & LIMITS_PIN) != (uint32_t)Bit_RESET)
#define LIMITE_GET()            ((LIMITE_PORT->PID & LIMITE_PIN) != (uint32_t)Bit_RESET)

#define KEYA_CODE   0x01
#define KEYB_CODE   0x02
#define KEYD_CODE   0x04

extern __IO uint8_t func_key_fun;
extern __IO uint8_t enc_code[2];

#define KEYA_READ()         GPIO_ReadInputDataBit(KEYA_PORT,KEYA_PIN)
#define KEYB_READ()         GPIO_ReadInputDataBit(KEYB_PORT,KEYB_PIN)
#define KEYD_READ()         GPIO_ReadInputDataBit(KEYD_PORT,KEYD_PIN)

#define FUNC_KEY_READ()     ENC1_Z_READ()
#define FUNC_KEY_ACTIVE     1
#define FUNC_KEY_CLEAR()    func_key_fun = CODE_NONE
#define FUNC_KEY_GET()      func_key_fun
#define BUTTON_GET()        button_code

#define ENC1_GET()          enc_code[0]
#define ENC1_CLEAR()        enc_code[0] = ENC_CODE_IDLE

void Key_Init(void);
void Button_handle(void);
uint8_t Check_enc(void);

void enc_sta_clear(void);
void enc_clear(void);
uint8_t enc_get(void);

#endif /* SRC_KEY_H_ */
